// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.main.mainimpl;

import android.content.Intent;
import android.graphics.Typeface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import com.eva.android.widget.ActivityRoot;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.noober.floatmenu.FloatMenu;
import com.noober.floatmenu.MenuItem;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.alarm.impl.AlarmsViewModel;
import com.x52im.rbchat.logic.contact.viewmodel.FriendsReqViewModel;
import com.x52im.rbchat.logic.qrcode.QRCodeScanActivity;
import com.x52im.rbchat.logic.search.SearchMainActivity;
import com.x52im.rbchat.logic.sns_group.GroupMemberActivity;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;

import java.util.ArrayList;

import androidx.lifecycle.ViewModelProvider;

/**
 * 主界面中的"消息"子Fragment的标题栏封装根类。
 * <p>
 * 当前，主界面的UI组织方式是：单Activity+多个子Fragment基于ViewPager方式进行切换。而Fragment不像Activity，
 * 它是没有title栏的，为了子Fragment切换为当前界面界面时，能及时显示它对应的标题栏（包括标题文本、标题栏功能功能
 * 等），一个子Fragment将对应一个本类实现，其中将实现对主界面Activity的title栏的设置，从而显示本Fragment对应的
 * 各项内容（包括标题文本、标题栏功能等）。
 *
 * @author Jack Jiang
 * @since 8.0
 */
public class AlarmsFragmentTitleWrapper extends AbstractFragmentTitleWrapper {

    private final static String TAG = AlarmsFragmentTitleWrapper.class.getSimpleName();

    /** 常量：标题栏"Add"按钮的弹出菜单项id——"添加好友" */
    private final int FLOAT_MENU_ID_ADD$USER_FOR_ADD_BUTTON = Menu.FIRST;
    /** 常量：标题栏"Add"按钮的弹出菜单项id——"创建群聊" */
    private final int FLOAT_MENU_ID_CREATE$GROUP_FOR_ADD_BUTTON = Menu.FIRST+1;
    /** 常量：标题栏"Add"按钮的弹出菜单项id——"扫一扫" */
    private final int FLOAT_MENU_ID_SCAN_FOR_ADD_BUTTON = Menu.FIRST+2;

    /** 标题栏的"Add"功能弹出菜单 */
    private FloatMenu floatMenu_forAddButton = null;
    /** 组件：标题栏右边的"Add"按钮引用 */
    private Button btnAdd;
    /** 组件：标题栏右边的"搜索"按钮引用 */
    private Button btnSearch;
    /** 组件：标题栏左边的"一键已读"按钮引用 */
    private Button btnAllRead;

    /** ViewModel："消息"列表数据ViewModel对象 */
    private AlarmsViewModel viewModel4Alarms = null;
    /** ViewModel：加好友请求数据ViewModel对象 */
    private FriendsReqViewModel viewModel4FriendReq = null;

    public AlarmsFragmentTitleWrapper(ActivityRoot parentActivity){
        super(parentActivity);
        this.viewModel4Alarms = new ViewModelProvider(parentActivity).get(AlarmsViewModel.class);
        this.viewModel4FriendReq = new ViewModelProvider(parentActivity).get(FriendsReqViewModel.class);
    }

    public void loadTitle(){
        // 先重置标题栏
        resetTitle();
        // 初始化标题栏右上角"添加"按钮
        initAddButton();
        // 初始化标题栏右上角"搜索"按钮
        initSearchButton();
        // 初始化标题栏左上角"一键已读"按钮
        initAllReadButton();
    }

    /**
     * 初始化标题栏右上角"添加"按钮.
     */
    private void initAddButton(){
        if(floatMenu_forAddButton == null){
            // 初始化标题栏上的"Add"按钮的浮动弹出菜单
            this.initFLoatMenu_forAddButton();
        }

        btnAdd = getTitleBar().getRightGeneralButton(R.drawable.main_alarms_head_right_btn);
        // 标题栏"Add"按钮的事件监听（点击显示弹出菜单）
        btnAdd.setOnClickListener(v -> floatMenu_forAddButton.show());
        // 为弹出菜单添加targetView
        floatMenu_forAddButton.setTargetView(btnAdd);
    }

    /**
     * 初始化标题栏左上角"一键已读"按钮.
     */
    private void initAllReadButton(){
        //**【1】标题栏左按钮的ui设置
        btnAllRead = getTitleBar().getLeftBackButton();
        btnAllRead.setVisibility(View.VISIBLE);
        btnAllRead.setText(parentActivity.getString(R.string.main_alarms_clear_all_unread));
        btnAllRead.setBackgroundResource(R.drawable.main_alarms_allread_btn);

        //**【2】标题栏左按钮的ui布局微调
        LinearLayout.LayoutParams params_1= (LinearLayout.LayoutParams) btnAllRead.getLayoutParams();
        // 宽度自动适应
        params_1.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        // 高度固定（单位：像素）
        params_1.height = WidgetUtils.dip2px(parentActivity, 26);
        // 距左边屏幕的衬距（单位：像素）
        params_1.leftMargin = WidgetUtils.dip2px(parentActivity, 14);//12

        //**【3】标题栏左按钮的ui细节设置
        // 字体大小（单位：sp）
        btnAllRead.setTextSize(12);
        // 字体颜色
        btnAllRead.setTextColor(parentActivity.getResources().getColor(R.color.common_btn_text_color_red));//gray_for_text));//common_list_light_red_for_text));// middle_gray1
        // 字体不要加粗
        btnAllRead.setTypeface(null, Typeface.NORMAL);
        // 设置内衬（上右下左）
        btnAllRead.setPadding(WidgetUtils.dip2px(parentActivity, 10)
                ,WidgetUtils.dip2px(parentActivity, 0)
                ,WidgetUtils.dip2px(parentActivity, 10)
                ,WidgetUtils.dip2px(parentActivity, 0));
        // 左右的图标
        WidgetUtils.setDrawLeft(parentActivity, R.drawable.main_alarms_head_allread_btn_ico2_2, btnAllRead);
        // 左边图标与文字间的间距（单位：像素）
        btnAllRead.setCompoundDrawablePadding(WidgetUtils.dip2px(parentActivity, 4));

        //**【4】标题栏左按钮的点击事件
        btnAllRead.setOnClickListener(v -> new AlertDialog.Builder(parentActivity)
                .setTitle(R.string.general_are_u_sure)
                .setMessage("将清除所有未读消息标记，包括未读数、红点（但不会删除消息本身），确定要这样做吗？")
                .setPositiveButton(R.string.general_yes, (dialog, which) -> doAllRead())
                .setNegativeButton(R.string.general_no, null)
                .show()
        );
    }

    /**
     * 初始化标题栏右上角"搜索"按钮.
     */
    private void initSearchButton(){
        btnSearch = getTitleBar().getLeftGeneralButton(R.drawable.common_title_btn_search);
        btnSearch.setOnClickListener(v -> {
            Intent intent = new Intent(parentActivity, SearchMainActivity.class);
            parentActivity.startActivity(intent);
        });
    }

    /**
     * 初始化标题栏上的"Add"按钮的浮动弹出菜单。
     */
    private void initFLoatMenu_forAddButton()
    {
        // 准备好要弹出的菜单item
        final ArrayList<MenuItem> menuItemList  = new ArrayList<>();
        menuItemList.add(new MenuItem()
                .setItem(parentActivity.getString(R.string.main_alarms_more_menuitem_add_friend))
                .setItemResId(R.drawable.main_alarms_floatmenu_adduser)
                .setItemActionId(FLOAT_MENU_ID_ADD$USER_FOR_ADD_BUTTON)
        );
        menuItemList.add(new MenuItem()
                .setItem(parentActivity.getString(R.string.main_alarms_more_menuitem_create_group))
                .setItemResId(R.drawable.main_alarms_floatmenu_addgroup)
                .setItemActionId(FLOAT_MENU_ID_CREATE$GROUP_FOR_ADD_BUTTON)
        );
        menuItemList.add(new MenuItem()
                .setItem(parentActivity.getString(R.string.main_alarms_more_menuitem_scan))
                .setItemResId(R.drawable.main_alarms_floatmenu_scan)
                .setItemActionId(FLOAT_MENU_ID_SCAN_FOR_ADD_BUTTON)
        );

        // 准备好弹出菜单对象
        floatMenu_forAddButton = new FloatMenu(parentActivity, null, 140);
        // 添加要显示的菜单项
        floatMenu_forAddButton.items(menuItemList);
        // 菜单项点击事件处理
        floatMenu_forAddButton.setOnItemClickListener((v, menuItemPosition) -> {
            MenuItem mi = menuItemList.get(menuItemPosition);
            if(mi != null) {
                switch (mi.getItemActionId()) {
                    // 添加好友
                    case FLOAT_MENU_ID_ADD$USER_FOR_ADD_BUTTON: {
                        parentActivity.startActivity(IntentFactory.createFindFriendIntent(parentActivity));
                        break;
                    }
                    // 创建群聊
                    case FLOAT_MENU_ID_CREATE$GROUP_FOR_ADD_BUTTON: {
                        parentActivity.startActivity(IntentFactory.createGroupMemberActivityIntent(
                                parentActivity, GroupMemberActivity.USED_FOR_CREATE_GROUP, null, true, null));
                        break;
                    }
                    // 扫一扫
                    case FLOAT_MENU_ID_SCAN_FOR_ADD_BUTTON: {
                        QRCodeScanActivity.gotoQrCodeScan(parentActivity);
                        break;
                    }
                }
            }
        });
    }

    private void doAllRead(){
        // 先清除未读消息数（包括列表中的消息未读当数和世界频道快捷组件上的未读数）
        if(this.viewModel4Alarms != null)
            // 通过ViewModel更新数据模型并通知ui层
            this.viewModel4Alarms.clearAllAlarmsAndBBSUnread();

        // 再清除未读的未处理好友总数
        if(this.viewModel4FriendReq != null) {
            // 通过ViewModel更新数据模型并通知ui层
            this.viewModel4FriendReq.clearUnreadCountData();

            // 同时强行把最近一次已读的最新一条请求时间戳重置为当前时间戳，确保重启app后，重新从网络加载最新未处
            // 理网络请求时，能正确计算最新的未读总数。关于未处理好友请求的"已读"、"未读"的实现和判断逻辑，请见：
            // QueryOfflineFriendsReqAsync.calculateUnreadFriendReqCount(..)方法的注释
            PreferencesToolkits.setHasReadLatestFriendReqTimestamp(MyApplication.getInstance2(), System.currentTimeMillis());
        }
    }
}